perm filename SOLN3B.S79[206,LSP] blob
sn#449544 filedate 1979-06-13 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Here is the LISP source code required to answer HomeWork Set 3
C00005 00003 (DIAGNOSIS PATIENTS DISEASES)
C00006 00004 (DEFUN DIAGNOSES (PATIENTS DISEASES)
C00009 ENDMK
C⊗;
; Here is the LISP source code required to answer HomeWork Set 3
; Spring 1979
(DEFUN PASS-NONE (PAT-HAS DIS-IS)
; This returns T iff None of "PATient-HAS" is in "DISease-IS"
(COND ((NULL DIS-IS) T)
((MEMQ (CAR DIS-IS) PAT-HAS) NIL)
(T (PASS-NONE PAT-HAS (CDR DIS-IS)))))
(DEFUN PASS-ALL (PAT-HAS DIS-IS)
; This returns T iff All of "PATient-HAS" is in "DISease-IS"
(COND ((NULL DIS-IS) T)
((MEMQ (CAR DIS-IS) PAT-HAS)
(PASS-ALL PAT-HAS (CDR DIS-IS)))
(T NIL)))
(DEFUN SELECT (CHECK-ME IF-PASS LIST)
; This returns a list of elements derived as followed:
; x ε SELECT... => x = (if-pass y) where (check-me y) true, for some y ε LIST
(COND ((NULL LIST) NIL)
(T ((LAMBDA (CAR-LIST) (COND ((FUNCALL CHECK-ME CAR-LIST)
(CONS (IF-PASS CAR-LIST)
(SELECT CHECK-ME
IF-PASS
(CDR LIST))))
(T (SELECT CHECK-ME
IF-PASS
(CDR LIST)))))
(CAR LIST)))))
(DEFUN DIAGNOSIS (P D)
; Performs the diagnosis, given Patients, P, and Diseases, D
(MAPCAR
'(LAMBDA (PAT)
(CONS
(CAR PAT)
((LAMBDA (SYMP)
(SELECT '(LAMBDA (DIS)
(AND (PASS-ALL SYMP (CADR DIS))
(PASS-NONE SYMP
(CADDR DIS))))
'CAR
D))
(CDR PAT))))
P))
; (DIAGNOSIS PATIENTS DISEASES)
; ((RDG FAIL-LISP-CLASS INSANITY HEALTHY) (DBL HEALTHY) (BCM
; LACONIC-NESS) (CLEOPATRA CHICKEN-POX) (DOLLAR FAIL-LISP-CLASS
; MIDAS-TOUCH INSANITY) (ICARUS FEAR-OF-FLYING HEALTHY) (FISHER
; CHESS-ITIS HEALTHY) (PAULING HAYFEVER) (BIGMOUTH FAIL-LISP-CLASS
; VERBOSITY INSANITY HEALTHY) (BIGMOUTH2 FAIL-LISP-CLASS LACONIC-NESS
; INSANITY HEALTHY) (NOTHING HEALTHY) (DIRTYNEEDLE HEPATITUS)
; (SMALLTALK LACONIC-NESS HEALTHY) (ROBBERBARON GERMAN-MEASLES)
; (SICKIE) (MRHANGOVER TOOTHACHE STOMACHACHE))
(DEFUN DIAGNOSES (PATIENTS DISEASES)
; This is the overall function, which returns list of diagnoses.
(MAPCAR
'(LAMBDA (PATIENT) (CONS (CAR PATIENT) (ONE-DIAGNOSIS PATIENT DISEASES)))
PATIENTS))
(DEFUN ONE-DIAGNOSIS (PAT DIS)
; This determines which diseases the patient, PAT, has.
; It uses list of dieseases, DIS.
(MAPCHOOSE-1 '(LAMBDA( DISEASE ) (PROBABLY-HAS PAT DISEASE) )
DIS) )
(DEFUN MAPCHOOSE-1 (F U)
; This returns a list, whose elements are of the form (F u), where
; u ε U and (F u) is non-NIL
; [NOTE: MAPCHOOSE would have returned the element "u" if (↑) satisfied]
(COND ((NULL U) NIL)
(((LAMBDA (TEST)
(AND TEST (CONS test (MAPCHOOSE-1 F (CDR U)))))
; if test is NIL, falls thru. Else, CONSes it to front
(FUNCALL F (CAR U))))
(T (MAPCHOOSE-1 F (CDR U)))))
(DEFUN ANDLIS (F X)
(COND ((NULL X) T)
(T (AND (APPLY F (LIST (CAR X))) (ANDLIS F (CDR X))))))